-- GDM
-- create by cheny3
-- GD功能

module("GDM", package.seeall)

-- GD功能对应NO
-- 注意保持和服务端一致
local gd_item = {
    ["add_map"] = 1,
    ["change_dungeon_progress"] = 2,
    ["add_pet"] = 3,
    ["add_attrib"] = 4,
    ["add_item"] = 5,
    ["change_achievement_progress"] = 6;
    ["set_attrib"] = 7,
    ["go_dungeon"] = 8,
    ["high_cool_rich"] = 9,
    ["high_cool_rich2"] = 10,
    ["high_cool_rich3"] = 11,
    ["invincible_buff"] = 12,
    ["skip_workshop_guide"] = 13,
    ["skip_dungeon_guide"] = 14,
};

function getGdItem()
    return gd_item;
end

-- DEBUG模式下才允许
function check_mode()
    return true;
end

-- 为玩家解锁地图
function add_map(area_id)

    if check_mode() ~= true then
        -- 不是DEBUG模式
        return;
    end

    if DungeonM.isInDungeon() then
        -- 在地牢中，直接返回
        alert(getLocStr("gd_msg1"));
	    return;
	end

    if DungeonAreaM.query(area_id) == nil then
        -- 不存在地图
        alert(getLocStr("gd_msg2"));
        return;
    end

    if DungeonAreaM.isAreaUnlocked(ME.user,area_id)
        or DungeonAreaM.isSubAreaUnlocked(ME.user,area_id) then
        -- 已经解锁地图
        alert(getLocStr("gd_msg3"));
        return;
    end

    -- 参数
    local args1, args2;
	args1 = area_id;
	args2 = 0;

    -- 给服务器发送打开地图命令
    Operation.cmd_gd_bonus(gd_item["add_map"], args1, args2);
end

-- 修改地图进度
function change_dungeon_progress(area_id, curr)
    if not checkChangePregress(area_id, curr) then
        return;
    end
    -- 参数
	local args1, args2;
	args1 = area_id;
	args2 = curr;

    -- 给服务器发送修改地图进度命令
    Operation.cmd_gd_bonus(gd_item["change_dungeon_progress"], args1, args2);
end

-- 增加冈布奥
function add_pet(pet_id)

    if check_mode() ~= true then
        -- 不是DEBUG模式
        return;
    end

    if PetM.query(pet_id) == nil then
        -- 没有相关数据
        alert(getLocStr("gd_msg6"));
        return;
    end

    if DungeonM.isInDungeon() then
        -- 在地牢中，直接返回
        alert(getLocStr("gd_msg1"));
	    return;
	end

	if PetM.getMyPet(pet_id) then
        -- 已经有该冈布奥
        alert(string.format(getLocStr("gd_msg7"), PetM.query(pet_id,"name")));
        return;
	end

    -- 参数
	local args1,args2;
	args1 = pet_id;
	args2 = 0

    -- 给服务器发送增加冈布奥命令
	Operation.cmd_gd_bonus(gd_item["add_pet"], args1, args2);
end

-- 增加属性（钻石/金钱/体力/血量/魔法值/攻击/最大血量/最大魔法值/探索点/魔力）
function add_attrib(attrib, value)

    if check_mode() ~= true then
        -- 不是DEBUG模式
        return;
    end

    local attribId = FieldsM.query(attrib, "id");
    if attribId == nil then
        -- 没有相关数据
        alert(getLocStr("gd_msg8"));
        return;
    end

    if value == nil or value == 0 then
        -- 输入数据非法
        alert(getLocStr("gd_msg4"));
        return;
    end

    if value < 0 then
        if ME.user:queryAttrib(attrib) < -value then
            -- 不足够扣除,提示,返回
            alert(getLocStr("gd_msg9"));
            return;
        end
    end

    if DungeonM.isInDungeon() and not DungeonM.isPause() then
        -- 在地牢中

        -- 增加同步
        local v1 = attribId;
        local v2 = value;
        if value <= 0 then
            v1 = attribId + 100;
            v2 = -value;
        end

        local data = bit.blshift(v1, 16) + v2;

		DungeonM.addAction({ ["cmd"] = "gd_bonus", ["pos"] = 4, ["data"] = data, });

        -- 客户端奖励
        if value > 0 then
            BonusM.doBonus({2, attrib, value,}, "gd_bonus");
        else
            ME.user:costAttrib(attrib, -value);
        end
	else
        -- 参数
	    local args1, args2;
		args1 = attrib;
		args2 = value;

        -- 给服务器发送增加属性命令
		Operation.cmd_gd_bonus(gd_item["add_attrib"], args1, args2);
	end
end

-- 增加物品
function add_item(item_id, count)

    if check_mode() ~= true then
        -- 不是DEBUG模式
        return;
    end

    -- 如果没有此道具
    if not ItemM.query(item_id) then
        return;
    end

    if DungeonM.isInDungeon() and not DungeonM.isPause() then
        -- 在地牢中

        -- 客户端奖励
        -- 如果小于0，则默认为减
        if count < 0 then
            local itemAmount = ItemM.getAmount(ME.user, item_id);
            count = math.min(-count, itemAmount);
            ItemM.costAmount(ME.user, item_id, count);
        else
            BonusM.doBonus({1, item_id, count}, "gd_bonus");
        end

        -- 增加同步
        local data = bit.blshift(item_id, 16) + count;
		DungeonM.addAction({ ["cmd"] = "gd_bonus", ["pos"] = 5, ["data"] = data, });
	else
        -- 参数
	    local args1, args2;
		args1 = item_id;
		args2 = count;

        -- 给服务器发送增加物品命令
        Operation.cmd_gd_bonus(gd_item["add_item"], args1, args2);
	end
end

-- 刷满dp
function change_achievement_progress(needDp)

    if check_mode() ~= true then
        -- 不是DEBUG模式
        return;
    end

    if DungeonM.isInDungeon() then
        -- 在地牢中，直接返回
        alert(getLocStr("gd_msg1"));
        return;
    end

    if AchievementM.isAllCompleted() then
        alert(getLocStr("gd_msg11"))
        return;
    end

    if AchievementM.isReachDp(needDp) then
        alert(getLocStr("gd_msg12"));
        return;
    end

    -- 给服务器发送增加物品命令
    local args1, args2;
    args1 = needDp;
    args2 = 0;
    Operation.cmd_gd_bonus(gd_item["change_achievement_progress"], args1, args2);
end

-- 设置属性（钻石/金钱/体力/血量/魔法值/攻击/最大血量/最大魔法值/探索点/魔力）
function set_attrib(attrib, value)

    if check_mode() ~= true then
        -- 不是DEBUG模式
        return;
    end

    local attribId = FieldsM.query(attrib, "id");
    if attribId == nil then
        -- 没有相关数据
        alert(getLocStr("gd_msg8"));
        return;
    end

    if value == nil or value == 0 then
        -- 输入数据非法
        alert(getLocStr("gd_msg4"));
        return;
    end

    if value < 0 then
        alert(getLocStr("gd_msg4"));
        return;
    end

    if DungeonM.isInDungeon() and not DungeonM.isPause() then
        -- 在地牢中

        -- 增加同步
        local data = bit.blshift(attribId, 16) + value;

        DungeonM.addAction({ ["cmd"] = "gd_bonus", ["pos"] = 7, ["data"] = data, });

        -- 客户端奖励
        local oldValue = ME.user:queryAttrib(attrib);

        local difValue = value - oldValue;
        if difValue > 0 then
            BonusM.doBonus({2, attrib, difValue,}, "gd_bonus");
        else
            ME.user:costAttrib(attrib, -difValue);
        end
    else
        -- 参数
        local args1, args2;
        args1 = attrib;
        args2 = value;

        -- 给服务器发送增加属性命令
        Operation.cmd_gd_bonus(gd_item["set_attrib"], args1, args2);
    end
end

-- 检查所有修改进度的是否合法
function checkChangePregress(area_id, curr)
    if check_mode() ~= true then
        -- 不是DEBUG模式
        return false;
    end

    if not ActivityDungeonM.isActivityDungeon(area_id)
        and DungeonAreaM.isDungeonPassBonusTaken(ME.user, area_id) then
        -- 已经通关
        alert(DungeonAreaM.query(area_id, "name") .. getLocStr("sub_area_pass"));
        return false;
    end

    if DungeonM.isInDungeon() then
        -- 在地牢中，直接返回
        alert(getLocStr("gd_msg1"));
        return false;
    end

    if DungeonAreaM.query(area_id) == nil then
        -- 不存在地图
        alert(getLocStr("gd_msg2"));
        return false;
    end

    if curr == nil or curr <= 0 then
        -- 输入层数非法
        alert(getLocStr("gd_msg4"));
        return false;
    end

    local maxFloor = DungeonAreaM.query(area_id, "max_floor");

    if curr > maxFloor and maxFloor ~= 0 then
        -- 超过最高层数
        alert(getLocStr("gd_msg5"));
        return false;
    end

    return true;
end

-- 直接进入某层
function goDungeon(dungeonId, layer)
    -- 检查下是否可以进入迷宫
    if not checkChangePregress(dungeonId, layer) then
        return;
    end

    Operation.cmd_gd_bonus(gd_item["go_dungeon"], dungeonId, layer);
end

-- 高富帅按钮
function highCoolRich()
    if check_mode() ~= true then
        -- 不是DEBUG模式
        return false;
    end

    if DungeonM.isInDungeon() then
        -- 在地牢中，直接返回
        alert(getLocStr("gd_msg1"));
        return false;
    end

    Operation.cmd_gd_bonus(gd_item["high_cool_rich"], 0, 0);
end

-- 高富帅按钮2
function highCoolRich2()
    if check_mode() ~= true then
        -- 不是DEBUG模式
        return false;
    end

    if DungeonM.isInDungeon() then
        -- 在地牢中，直接返回
        alert(getLocStr("gd_msg1"));
        return false;
    end

    Operation.cmd_gd_bonus(gd_item["high_cool_rich2"], 0, 0);
end

-- 加满镐头数目
function fullWatchShovels()
    if isIosPlatform() then
        callOCFunc("fullShovelNum");
    else
        alert(getLocStr("disable_function"));
    end
end

-- 开启活动
function openActivity(id, startTime, duration)
    if check_mode() ~= true then
        -- 不是DEBUG模式
        return false;
    end

    Operation.cmd_gd_open_activity(id, startTime, duration);
end

-- 关闭活动
function closeActivity(id)
    if check_mode() ~= true then
        -- 不是DEBUG模式
        return false;
    end

    Operation.cmd_gd_close_activity(id);
end

-- 高富帅按钮2
function highCoolRich3()
    if check_mode() ~= true then
        -- 不是DEBUG模式
        return false;
    end

    if DungeonM.isInDungeon() then
        -- 在地牢中，直接返回
        alert(getLocStr("gd_msg1"));
        return false;
    end

    Operation.cmd_gd_bonus(gd_item["high_cool_rich3"], 0, 0);
end

function invincibleBuff(isOpen)
    if check_mode() ~= true then
        -- 不是DEBUG模式
        return false;
    end

    if DungeonM.isInDungeon() and not DungeonM.isPause() then
        -- 在地牢中，直接返回
        DungeonM.addAction({ ["cmd"] = "gd_bonus", ["pos"] = 12, ["data"] = isOpen, });
    else
        -- 给服务器发送增加属性命令
        Operation.cmd_gd_bonus(gd_item["invincible_buff"], 0, isOpen);
    end
end

-- 跳过炼金引导
function skipWorkshopGuide()
    Operation.cmd_gd_bonus(gd_item["skip_workshop_guide"], 0, 0);
end

-- 跳过新手引导
function skipDungeonGuide()
    Operation.cmd_gd_bonus(gd_item["skip_dungeon_guide"], 0, 0);
end